package cn.demoncat.util.zookeeper;

import java.io.IOException;

import org.apache.commons.lang3.StringUtils;
import org.apache.zookeeper.client.FourLetterWordMain;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.demoncat.util.lang.IntegerUtil;
import cn.demoncat.util.lang.StringUtil;
import cn.demoncat.util.zookeeper.constant.CommandConstant;
import cn.demoncat.util.zookeeper.entity.ZkServerStat;


/** 
 * Zookeeper命令行工具
 * 
 * @author 延晓磊
 *
 * @since 2018年11月6日
 */
public class CommandUtil {
	
	private static final Logger LOG = LoggerFactory.getLogger(CommandUtil.class);
	
	/**
	 * 执行ZK四字命令
	 * 
	 * @param ip
	 * @param port
	 * @param command	四字命令
	 * @return 成功返回String[]；失败返回null
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年11月6日
	 */
	public static String[] command(String ip, int port, String command) {
		String[] arr = null;
		try {
			// ZK四字命令：socket连接ZK服务端地远程命令，按行读取返回结果
			String result = FourLetterWordMain.send4LetterWord(ip, port, command);
			if (StringUtils.isNotBlank(result)) {
				arr = StringUtil.splitLine(result);
			}
		} catch (IOException e) {
			LOG.error("通过Socket连接Zookeeper并执行命令失败：ip = {}, port = {}, command = {}", ip ,port, command, e);
		}
		return arr;
	}
	 
	/**
	 * 查询服务端的状态信息
	 * 
	 * @param ip
	 * @param port
	 * 
	 * @return 成功返回Stat；失败返回null
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年11月6日
	 */
	public static ZkServerStat stat(String ip, int port) {
		// 执行远程命令
		String[] arr = command(ip, port, CommandConstant.STAT);
		if (arr != null) {
			// 状态
			ZkServerStat stat = new ZkServerStat();
			for (String str : arr) {
				str = str.trim();
				// 版本
				if (stat.getVersion() == null) {
					if (str.contains("Zookeeper version:")) {
						// Zookeeper version: 3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
						str = str.substring("Zookeeper version:".length()).trim();
						if (str.contains("-")) {
							str = str.split("-",2)[0];
						}else {
							StringBuilder sd = new StringBuilder();
							String s;
							for (int i=0; i<str.length(); i++) {
								s = String.valueOf(str.charAt(i));
								if (s.matches("[0-9.]")) {
									sd.append(s);
								}else {
									break;
								}
							}
							str = sd.toString();
						}
						stat.setVersion(str);
					}
				}
				// 连接数
				if (stat.getConnections() == null) {
					if (str.contains("Connections:")) {
						stat.setConnections(IntegerUtil.valueOfZero(str.substring("Connections:".length())));
					}
				}
				// 模式
				if (stat.getMode() == null) {
					if (str.contains("Mode:")) {
						stat.setMode(str.substring("Mode:".length()).trim());
					}
				}
				// 节点数
				if (stat.getCount() == null) {
					if (str.contains("Node count:")) {
						stat.setCount(IntegerUtil.valueOfZero(str.substring("Node count:".length())));
					}
				}
			}
			return stat;
		}
		return null;
	}
	 
	/**
	 * 查询服务端的运行状态
	 * 
	 * @param ip
	 * @param port
	 * @return 
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年11月6日
	 */
	public static boolean ruok(String ip, int port) {
		// 执行远程命令
		String[] arr = command(ip, port, CommandConstant.RUOK);
		// imok检测
		if (arr != null) {
			for (String str : arr) {
				if (str.contains("imok")) {
					return true;
				}
			}
		}
		return false;
	}
	
	/**
	 * 查询服务端的配置
	 * 
	 * @param ip
	 * @param port
	 * @return 成功返回String[]；失败返回null
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年11月6日
	 */
	public static String[] conf(String ip, int port) {
		// 执行远程命令
		return command(ip, port, CommandConstant.CONF);
	}
 
	
}
